const Service = require("egg").Service;
const NotFoundException = require("../exception/not_found");
const { Op } = require("sequelize");

Date.prototype.Format = function (fmt) {
  const o = {
    "M+": this.getMonth() + 1, // 月份
    "d+": this.getDate(), // 日
    "H+": this.getHours(), // 小时
    "m+": this.getMinutes(), // 分
    "s+": this.getSeconds(), // 秒
    "q+": Math.floor((this.getMonth() + 3) / 3), // 季度
    S: this.getMilliseconds(), // 毫秒
  };
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(
      RegExp.$1,
      (this.getFullYear() + "").substr(4 - RegExp.$1.length)
    );
  }
  for (const k in o) {
    if (new RegExp("(" + k + ")").test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)
      );
    }
  }
  return fmt;
};

class ProgressService extends Service {
  // 更新
  async setProgress(params) {
    const { ctx } = this;
    const user_id = ctx.state.user.user_id;
    try {
      const { wordId, status = "unlearned" } = params; // 默认状态为'unlearned'

      // 使用findOrCreate方法，如果不存在则创建，存在则更新
      const [progress, created] = await ctx.model.Progress.findOrCreate({
        where: {
          user_id,
          word_id: wordId,
        },
        defaults: {
          user_id,
          word_id: wordId,
          status,
        },
      });

      // 如果记录已存在且不是新创建的，则更新状态
      if (!created) {
        await progress.update({ status });
      }

      return progress;
    } catch (error) {
      throw new NotFoundException("操作失败", 500);
    }
  }

  // 获取当天学习单词数
  async getTodayProgressCount(params) {
    const { ctx } = this;
    const user_id = ctx.state.user.user_id;

    try {
      // 获取当天开始和结束的时间
      const todayStart = new Date();
      todayStart.setHours(0, 0, 0, 0);

      const todayEnd = new Date();
      todayEnd.setHours(23, 59, 59, 999);

      // 查询当天更新的学习记录数量（排除未学习的）
      const count = await ctx.model.Progress.count({
        where: {
          user_id,
          createdAt: {
            [Op.between]: [todayStart, todayEnd], // 创建时间在今天范围内
          },
        },
      });

      return count;
    } catch (error) {
      ctx.logger.error("获取当天学习单词数量失败:", error);
      throw new NotFoundException("获取学习进度失败", 500);
    }
  }
  // 更新复习单词时间
  async updateReviewTime({ ids }) {
    const { ctx, app } = this;
    const user_id = ctx.state.user.user_id;
    console.log("------看看ids-------", ids);
    console.log("------end-------");
    try {
      const result = await ctx.model.Progress.update(
        { last_reviewed_at: new Date(), status: "learned" },
        {
          where: {
            user_id: user_id,
            word_id: {
              [Op.in]: ids,
            },
          },
        }
      );
      return result;
    } catch (error) {
      console.log("------看看error-------", error);
      console.log("------end-------");
      return false;
    }
  }
}

module.exports = ProgressService;
